今天宠物迷的小编给各位宠物饲养爱好者分享字符串设置编码的宠物知识,其中也会对c++ 如何知道当前字符串的编码类型(c语言字符类型判断代码)进行专业的解释,如果能碰巧解决你现在面临的宠物相关问题,别忘了关注本站哦,现在我们开始吧!
编程中遇到的编码一共两种,单字节和多字节,各种字符串类,宏的本质要么是char*,要么是wchar_t *
char*基础单位是一个字节,如果用来储存中文那么每个中文会占用2个字节,也就是两个基础单位
wchar_t*基础单位是2字节,如果用来储存中文那么每个文字只要1个单位就可以了,但本质上还是用了2个字节
可以看一下string类的基础单位是char*,wstring的基础单位是wchar_t*,同理还有CStringA是char*,CStringW是wchar_t*,另外还有各种宏
LPSTR: char *
LPCSTR: const char *
LPWSTR: wchar_t *
LPCWSTR: const wchar_t *
LPTSTR: TCHAR *
LPCTSTR: const TCHAR *
至于编码格式,其实这些字符本质是用整数,比如数字‘0’对应48,这是一套国际标准,所有的电脑都知道某个整数对应的字符内容
这个跟进制没关系,在内存中数据确实是以2进制储存的,但是相比之下110000对应字符‘0’和48对应字符‘0’人们更容易接受后者,他们本质上是一个概念
假设你的字符串的字节数组是buf,按照GBK解析这个字符串的方法就是如下
String str=new String(buf,0,buf.length,"GBK");
如果是utf-8编码,就把GBK换成utf-8即可
using System.Text;
byte[] buffer = Encoding.GetEncoding("utf-8").GetBytes("中国");
string str = "";
foreach (byte b in buffer) str += string.Format("%{0:X}", b);
如果输出到命令行,默认为 UTF8
如果输出到文件,默认为ANSI
如果是修改文件的编码方式,可以按以下步骤:
选中文件右键-->Properties-->Resource-->Text file encoding-->选中Other,然后选择自己想要的编码格式就可以了。
如果是修改MyEclipse的编码方式,可以按以下步骤:
菜单栏的Window-->Perferences-->General-->Work Space-->Text file encoding-->选中Other,然后选择自己想要的编码格式就可以了。
字符串的比较不能用==得使用equals();
希望的我回答能被您采纳!谢谢
我先解释一下我对你的问题的理解 :
你的问题有点笼统 可以这么理解两个意思 : 一 ,你是想吧一个gbk编码的字符串用utf-8格式来编码
String s = new String ("全国".getBytes("GBK"),"GBK");
虽然这个时候的s是GBK编码的 但是s还是中文字符的 所以 上面这位同胞用 new(s.getBytes("GBK"),"UTF-8")的方式肯定是错的 应该用 String s1 = new String (s.getBytes("UTF-8"),"UTF-8") 这样s1就是UTF-8编码的字符串了
二,如果是遇见乱码问题 比如 String s = new String ("全国".getBytes("GBK"),"GBK");
这样的s就是gbk编码的 现在你要把GBK格式的编码用UTF-8去编码 肯定就会出现乱码
String s2 = new String(s.getBytes("GBK"),"UTF-8"); 这个s2肯定是乱码的 而且这样就根本解不出来了 系统出现的乱码显示的时候才会出现编码错误 所以 一般出现乱码 只要把输入流换个编码解析一下就ok了 还有什么不明白 可以问我
客户端:
ui->plainTextEdit(文本编辑器)里边有中文英文还有日期,相当于日志文件。
// 不是简单的“中文”字符串,是放在QString变量里的,转换成QByteArray后就是另外一种乱码。。。。
QString str = ui->plainTextEdit->toPlainText( );
QByteArray byData;//要发送给服务器端的数据包
QByteArray byToken = QString( "FutureInternet" ).toAscii( );
QByteArray byBody = "select log table";
// 通过这个转换似乎丢了些数据。还是乱码
QString text = QString::fromLocal8Bit( (const char *)&str, str.length() );
qDebug() << text << endl;
byBody.append( text );
quint32 nLength = byToken.length( ) +
sizeof ( quint32 ) +
byBody.length( );
nLength = htonl( nLength );
byData.append( byToken );
byData.append( ( const char* ) &nLength,
sizeof ( quint32 ) );
byData.append( byBody );
clientThread->PostDataEvent( byData );
整理 MySQL 8.0 文档时发现一个变更:
默认字符集由 latin1 变为 utf8mb4。想起以前整理过字符集转换文档,升级到 MySQL 8.0 后大概率会有字符集转换的需求,在此正好分享一下。
当时的需求背景是:
部分系统使用的字符集是 utf8,但 utf8 最多只能存 3 字节长度的字符,不能存放 4 字节的生僻字或者表情符号,因此打算迁移到 utf8mb4。
迁移方案一1. 准备新的数据库实例,修改以下参数:[mysqld]## Character Settingsinit_connect='SET NAMES utf8mb4'#连接建立时执行设置的语句,对super权限用户无效character-set-server = utf8mb4collation-server = utf8mb4_general_ci#设置服务端校验规则,如果字符串需要区分大小写,设置为utf8mb4_binskip-character-set-client-handshake#忽略应用连接自己设置的字符编码,保持与全局设置一致## Innodb Settingsinnodb_file_format = Barracudainnodb_file_format_max = Barracudainnodb_file_per_table = 1innodb_large_prefix = ON#允许索引的最大字节数为3072(不开启则最大为767字节,对于类似varchar(255)字段的索引会有问题,因为255*4大于767)
2. 停止应用,观察,确认不再有数据写入
可通过 show master status 观察 GTID 或者 binlog position,没有变化则没有写入。
3. 导出数据
先导出表结构:mysqldump -u -p --no-data --default-character-set=utf8mb4 --single-transaction --set-gtid-purged=OFF --databases testdb > /backup/testdb.sql
后导出数据:mysqldump -u -p --no-create-info --master-data=2 --flush-logs --routines --events --triggers --default-character-set=utf8mb4 --single-transaction --set-gtid-purged=OFF --database testdb > /backup/testdata.sql
4. 修改建表语句
修改导出的表结构文件,将表、列定义中的 utf8 改为 utf8mb4
5. 导入数据
先导入表结构:mysql -u -p testdb < /backup/testdb.sql
后导入数据:mysql -u -p testdb < /backup/testdata.sql
6. 建用户
查出旧环境的数据库用户,在新数据库中创建
7. 修改新数据库端口,启动应用进行测试
关闭旧数据库,修改新数据库端口重启,启动应用
本文由宠物迷 百科常识栏目发布,非常欢迎各位朋友分享到个人朋友圈,但转载请说明文章出处“c++ 如何知道当前字符串的编码类型”
上一篇
保暖内衣男士什么牌子好
下一篇
老年犬的年龄标准以饲养要点